;(function () {
  'use strict';
  /**
   *  定义业务量对比服务
   */
  angular.module('services.omdisplay.sysBusStat')
    .factory('contrastiveAnalysis', contrastiveAnalysis)
    .factory('contrastiveStaticServer',contrastiveStaticServer)
    .factory('contrastiveLogicServer',contrastiveLogicServer)
    .factory('ContrastiveDynamic',ContrastiveDynamic);
    function  contrastiveAnalysis(Restangular,CoreService,ContrastiveDynamic,contrastiveStaticServer){
      return {
        //查询业务线
        businessLineQuery: function (callback) {
          Restangular.one('sas/common/businessLineQuery').get().then(callback);
        },
        //渠道
        getChannel: function(params,callback){
          Restangular.all('sas/common/accessChannelsQuery').post(params).then(callback);
        },
        //交易类型
        getTransacTion: function(params,callback){
          Restangular.all('sas/common/tradeTypeQuery').post(params).then(callback);
        },

        //查询接入渠道
        accessChannelsQuery: function (params,callback) {
          return Restangular.all('sas/common/accessChannelsQuery').post(params).then(callback);
        },
        //机构查询
        agencyQuery: function () {
         return  Restangular.one('sas/common/agencyQuery').get();
        },
        //交易类型查询
        transacTion: function () {
           var items={businessLine:[]};items.businessLine.push(ContrastiveDynamic.contrastive.businessLine.businessLineCode);
          Restangular.all('sas/common/tradeTypeQuery').post(items).then(
           function(res){
               contrastiveStaticServer.getTransactions = res.state==='10000' ? res.data : [];
           }
         );
         return contrastiveStaticServer;
        },
        portfolioTimeQuery: function (params, callback) {
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/portfolioTimeQuery').post(params).then(callback);
        },
        /**
         * 业务量省份查询
         */
        portfolioprovinceQuery: function (params, callback) {
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/portfolioprovinceQuery').post(params).then(callback);
        },
        /**
         * 订单金额时间查询
         */
        orderAmountTimeQuery: function (params, callback) {
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/orderAmountTimeQuery').post(params).then(callback);
        },

        orderAmountProviceQuery: function (params, callback) {
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/orderAmountProviceQuery').post(params).then(callback);
        },
        /**
         * 充值金额时间查询
         */
        payTimeQuery: function (params, callback) {
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/payTimeQuery').post(params).then(callback);
        },
        /**
         * 充值金额省份查询
         */
        payProviceQuery: function (params, callback) {
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/payProviceQuery').post(params).then(callback);
        },
        /**
         *  业务量汇总查询
         */
        portfolioCollectQuery : function(params,callback){
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/portfolioCollectQuery').post(params).then(callback);
        },
        /**
         *  交易金额汇总查询
         */
        orderAmountCollectQuery:function(params,callback){
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/orderAmountCollectQuery').post(params).then(callback);
        },
        /**
         *  充值金额汇总查询
         */
        payCollectQuery :function(params,callback){
          Restangular.all('sas/Omdisplay/sysBusinessStatistics/payCollectQuery').post(params).then(callback);
        }
      };
    }
     contrastiveAnalysis.$inject=['Restangular','CoreService','ContrastiveDynamic','contrastiveStaticServer'];

  function contrastiveStaticServer() {
      return {
        getAnalysisTypes:[
          {analysisCode: '0101',analysisName: '同比'}, 
          {analysisCode: '0102',analysisName: '环比'}
        ],
        getShowTypes:getShowTypes,
        getTransactions:[]
      };
      function getShowTypes(code){
        var types = [
          {showTypeCode:'2',showTypeName:'汇总'},
          {showTypeCode: '0',showTypeName: '时刻'},
          {showTypeCode: '1',showTypeName: '省份'},
        ];
        switch(code){
          case '1':
            types[1].showTypeName = '时刻';
            break;
          case '3':
            types[1].showTypeName = '日期';
            break;
          case '4':
            types[1].showTypeName = '季度';
            break;
          case '5':
            types[1].showTypeName = '月份';
            break;
        }
        return types;
      }
    }

  function ContrastiveDynamic () {
    return{
      contrastive:{
        transaction:[],
        businessLine:'',
      },
      param:{
        timeType:'1'
      },
       analysis:'0101',
       showType:'2',
       flex:false,
       lengthSwitch:false,
     item:{
       startTime:'',
       startTimes:'',
       endTime:'',
       endTimes:''
     }
     };
  }

  function contrastiveLogicServer(ContrastiveDynamic,$filter){
    return{
      timeSplitRequest :timeSplitRequest,
      timedefault : timedefault,
      dvalue : dvalue,
      barLegend : barLegend,
      parseObj :parseObj,
      xAxis :  xAxis,
      showText:showText,
      paramInit:paramInit,
      timeFormart:timeFormart,
      textFormaty:textFormaty,
      quarter:quarter,
      xAxisTime:xAxisTime,
      getMaxDay:getMaxDay,
      dataProvinceClassification:dataProvinceClassification,
      timeAnalysis:timeAnalysis,
      judgeQuerty : judgeQuerty,
      parsefailed:parsefailed
    };
/**
 * [timeSplitRequest 截取时间为季度的时候,生产年与季的对象]
 * @param  {[type]} date [description]
 * @return {[type]}      [description]
 */
  function timeSplitRequest(date){
    var timeType={};
    timeType.quarter=date.substring(4,5);
    timeType.timeYear=date.substring(0,4);
    return timeType;
  }
/**
 * 时间默认值
 */
  function timedefault(date,analysis){
    var year = new Date().getFullYear();
    var month = new Date().getMonth();
    var day = new Date().getDate();
    ContrastiveDynamic.item.startTime=date==='3' ?  new Date(year-1, month) : date==='1' ? new Date(year-1,month,day-1) : date==='4' ? year-1+'1' : year-1;
    ContrastiveDynamic.item.startTimes= ContrastiveDynamic.item.startTime;
    if(analysis==='0101'){
      ContrastiveDynamic.item.endTime=date==='3' ? new Date(year,month) : date==='1' ? new Date(year-1,month+1,day-1) : date==='4' ? year+'1' :year;
    }else{
       ContrastiveDynamic.item.endTime=date==='3' ? new Date(year-1,month+1) : date==='1' ? new Date(year-1,month,day) : date==='4' ? year+'1' :year;
    }
    ContrastiveDynamic.item.endTimes= ContrastiveDynamic.item.endTime;
  }

  //计算差值 年为number型 所以直接减
  function dvalue(timeType,startTime,endTime){
    switch (timeType){
      case '5':case '4':
        return  endTime-startTime;
      case '3' :
        return   ((endTime.getFullYear()*12+endTime.getMonth()+1)-(startTime.getFullYear()*12+startTime.getMonth()+1)); 
      case '1' :
        return  (new Date(endTime)-new Date(startTime))/86400000;  
    }
  }
// echarts 图表显示传入的为3个对象分别为开始时间业务量,结束时间业务量，以及对比的数据
  function barLegend(seriesData,seriesstateName,seriesendName,typeName,xAxisData,yName,rotateDate,titleName){
    var option = {
      animation:false,
      legend:{
       data:[seriesstateName,seriesendName,'比值(%)']
      },
      tooltip: {
        trigger: 'axis',
        axisPointer : {            // 坐标轴指示器，坐标轴触发有效
            type : 'shadow'        // 默认为直线，可选为：'line' | 'shadow'
        },
      },
      grid: {
        borderWidth: '0.1',
        borderColor: '#616161',
        x:'10%',
        y2:'80px'
      },
      xAxis: [{
        type: 'category',
        data: xAxisData,
          axisLabel: {
          show: true,
          rotate: rotateDate,
        },
        axisLine:true,
      }],
      yAxis: [{
        type: 'value',
        name: yName,
      },{
        type: 'value',
        name: '比值',
        axisLabel: {
          formatter: '{value} %'
        },
      splitLine:false,
      }],
      series: [{
        type: 'bar',
        data: seriesData.portfolio,
        markPoint:{
          data:[
             {type:'max',name :titleName+'最大值' }
          ],
        },
        name: seriesstateName,
        barMaxWidth:40,
       }, 
      {
        type: 'bar',
        data: seriesData.portfolios,
        markPoint:{
          data:[
             {type:'max',name :titleName+'最大值' }
          ],
        },
        name:seriesendName,
        barMaxWidth:40
       }, {
        type: typeName,
        yAxisIndex: 1,
        smooth:true,
        data: seriesData.contrastar,
        name: '比值(%)',
        barMaxWidth:40
      }]
    };
  return option;
  }
/**
 * [parseObj 解析发送后台数据]
 * @param  {[type]} data  [description]
 * @param  {[type]} param [description]
 * @return {[type]}       [description]
 */
function parseObj(data,param){
 var params=[];
 if( is.array(data) && data.length > 0){
     data.map(function(item){
     params.push(item[param]);
    });
   return params; 
 }else{
   return [];
 }
}

function parsefailed(data,param,datas){
 var params=[];
 if( is.array(data) && data.length > 0){
     data.map(function(item){
     params.push(item[param]);
    });
   return params; 
 }else{
    datas.map(function(item){
     params.push(item[param]);
    });
   return params;
 }
}
/**
 * [xAxis 省份查询与汇总查询图形x轴数据]
 * @return {[type]} [description]
 */
function xAxis(data,param){
  var xAxisData = [];
   angular.forEach(data, function(key) {
      xAxisData.push(key[param]);
   });
  return xAxisData;
}
/**
 * [showText 标题动态显示方法]
 * @return {[type]} [显示的字符串]
 */
function showText(timeType){
  return timeType==='5' ? '月' : timeType==='1' ? '时刻' : timeType==='3' ? '日' : '季度';
}

function paramInit(){
  ContrastiveDynamic.contrastive={
    transaction:[],
    businessLine:'',
  };
  ContrastiveDynamic.param={
    timeType:'1'
  };
  ContrastiveDynamic.analysis='0101';
  ContrastiveDynamic.showType='2';
  ContrastiveDynamic.flex=false;
  ContrastiveDynamic.lengthSwitch=false;
}
function timeFormart(value,data){
  var formatType=value==='5' ? 'yyyy-01-01' : value==='3' ? 'yyyy-MM-01' : 'yyyy-MM-dd';
    return  $filter('date')(new Date(Date.parse(data)), formatType);
}
/**
 * 标题格式化
 */
function textFormaty(value,data){
  var formatType=value==='5'||value==='4' ? 'yyyy' : value==='3' ? 'yyyyMM' : 'yyyyMMdd';
  return $filter('date')(new Date(Date.parse(data)), formatType);
}
//用于给页面展示季度方法
  function quarter(puarter,timeType){
    if(timeType !=='4'){
      puarter='5';
    }
   return puarter=== '1' ? '第一季度' : puarter==='2' ? '第二季度' : puarter==='3' ? '第三季度' : puarter==='4' ? '第四季度' : '';
  }
   /**
   * 图表x轴的动态生产
   * 年的时候有12个月的数组,为月的时候日,日的时候24个时刻
   * 4 2 0
   * 4的时候发送的是月份， 2 发送的是小时
   * 判断发送过来的数据的长度动态判断x轴的数据
   */
    function xAxisTime(timeType){
      var xAxisName={};var i;
      var param ={
        xAxisDatas:[],
        xAxisData:[]
      };
      timeType==='4' ?  xAxisName = '季' : timeType==='5' ?  xAxisName = '月' : timeType==='3' ? xAxisName = '日': xAxisName = '时刻';
      switch(timeType){
      case '3':
      if(ContrastiveDynamic.item.startTimes.getFullYear()-ContrastiveDynamic.item.startTime.getFullYear()>=1 || ContrastiveDynamic.item.endTime.getFullYear()-ContrastiveDynamic.item.endTimes.getFullYear()>=1 || 
         ContrastiveDynamic.item.startTimes.getMonth()-ContrastiveDynamic.item.startTime.getMonth()>1 || ContrastiveDynamic.item.endTimes.getMonth()-ContrastiveDynamic.item.endTime.getMonth()>1){
        for( i=1;i<32;i++){
          param.xAxisData.push(i+ xAxisName);
          param.xAxisDatas.push(''+i);
        }
      }else{
        var maxNum=getMaxDay(ContrastiveDynamic.item.startTime.getFullYear(),ContrastiveDynamic.item.startTime.getMonth());
        var maxNum1=getMaxDay(ContrastiveDynamic.item.endTime.getFullYear(),ContrastiveDynamic.item.endTime.getMonth());
        if(maxNum-maxNum1>=0){
          for( i=1;i<=maxNum;i++){
          param.xAxisData.push(i+ xAxisName);param.xAxisDatas.push(''+i);
          }
        }else{
           for( i=1;i<=maxNum1;i++){
          param.xAxisData.push(i+ xAxisName); param.xAxisDatas.push(''+i);
          }
        }
      }
      break ;  
    case '1' :

      // if(ContrastiveDynamic.contrastive.businessLine.businessLineCode ==='2'  ||ContrastiveDynamic.contrastive.businessLine.businessLineCode ==='3' ){
       for( i=0;i<=23;i++){
         param.xAxisData.push(i+ xAxisName);
         param.xAxisDatas.push(''+i);
        }
      // }
      break ;
    case '5' :
      for( i=1;i<=12;i++){
         param.xAxisData.push(i+ xAxisName);param.xAxisDatas.push(''+i);
        }
       break ; 
    case '4' :
        for( i=1;i<=4;i++){
        param.xAxisData.push(i+ xAxisName);param.xAxisDatas.push(''+i);
        }   
        break ;   
    } 
    return param;
  }

 /**
  * [getMaxDay 判断一个月的最大天数]
  * @param  {[type]} Y [年]
  * @param  {[type]} M [月]
  * @return {[NUMBER]}   [天数]
  */
function getMaxDay(year,month){
    return 32-new Date(year,month,32).getDate();  
} 
 /**
  * [dataProvinceClassification 省份y轴数据数组迭代]
  * @param  {[type]} data [后台返回身份数据]
  * @return {[type]}      [description]
  */
   function dataProvinceClassification(data){
    var params = {portfolio: [],portfolios: [],contrastar: []};
    angular.forEach(data, function(key) {
      params.portfolio.push(key.portfolio);
      params.portfolios.push(key.portfolios);
      params.contrastar.push(key.contrastar);
    });
    return params;
  }
   /**
   * 根据对比方式 设置开始时间和结束时间的默认值
   * 给开始时间设定初始值 为年
   * 如果时间格式为年的时候;默认设置结束时间2为当前时间,结束时间1为当前时间的前一天;
   * 开始时间为前一天到，给4个时间设置为时间对象;在根据选择打账期为多少.
   * 当是环比为年打时候：与同比一样的处理样式。
   *
   *  环比月：初始化时间与上一个月的对比,月调用的是month方法.开始时间第一个时间与结束时间
   *  相差二个月，开始时间打结束时间与结束时间的开始时间相同;
   *  同比月：初始化时间：结束时间：初始化时间为当前打年份月环比相同:开始时间则分别用初始化时间的调用年的方法
   *  减去一此时得到打数据在放入月份的方法吧开始时间的结束时间：(-1)得到现在的月份的后一个月
   *
   *  环比日 ：初始化时间:当前的时间与昨天的对比:开始时间的结束时间与结束时间的开始时间相同,而开始时间的开始时间与结束时间
   *  相差1年：今天与昨天对比
   *  同比日 : 初始化时间：结束时间与环比的时候相同:开始时间的结束时间为现在的时间前一年，开始时间为当前时间前一年
   *
   *  环比季与同比季:  结束时间为当前的时间：开始时间为强一年的时间
   *
   *  环比年同比年:根据现在的时间给出默认时间,设置把现在的时间转为转化为年的时间,转化为字符串，
   *
   *  同比季：默认与同比年的年份相同,默认季节是1季度到第四季度
   *  给结束时间一个默认值,用于日和月
   */
  function timeAnalysis(value,newValue){
    if(Boolean(ContrastiveDynamic.item.startTime) && Boolean(ContrastiveDynamic.item.startTimes)){
      if(newValue==='0101'){
        switch (value){
          case '5' :
          ContrastiveDynamic.item.endTime=ContrastiveDynamic.item.startTimes+1;
          ContrastiveDynamic.item.endTimes=ContrastiveDynamic.item.endTime+dvalue(value,ContrastiveDynamic.item.startTime,ContrastiveDynamic.item.startTimes);
          if (ContrastiveDynamic.item.endTime>new Date()){ContrastiveDynamic.item.endTime=new Date().getFullYear();}  
          if (ContrastiveDynamic.item.endTimes>new Date()){ContrastiveDynamic.item.endTimes=new Date().getFullYear();}  
          break;
          case '4' :
             ContrastiveDynamic.item.endTime=judgeQuerty('0101',ContrastiveDynamic.item.startTime);
             ContrastiveDynamic.item.endTimes=judgeQuerty('0101',ContrastiveDynamic.item.startTimes);
            break;  
          case '1' :
             if(ContrastiveDynamic.item.startTime.getMonth()!==ContrastiveDynamic.item.startTimes.getMonth()){
               ContrastiveDynamic.item.endTime=new Date(new Date(ContrastiveDynamic.item.startTime).setFullYear(new Date(ContrastiveDynamic.item.startTime).getFullYear()+1));
               ContrastiveDynamic.item.endTimes=new Date(new Date(ContrastiveDynamic.item.startTimes).setFullYear(new Date(ContrastiveDynamic.item.startTimes).getFullYear()+1));
             }else{
               ContrastiveDynamic.item.endTime=new Date(new Date(ContrastiveDynamic.item.startTime).setMonth(new Date(ContrastiveDynamic.item.startTime).getMonth()+1));
               ContrastiveDynamic.item.endTimes=new Date(new Date(ContrastiveDynamic.item.startTimes).setMonth(new Date(ContrastiveDynamic.item.startTimes).getMonth()+1));
             }
            if (ContrastiveDynamic.item.endTime>new Date()){ContrastiveDynamic.item.endTime=new Date();}  
            if (ContrastiveDynamic.item.endTimes>new Date()){ContrastiveDynamic.item.endTimes=new Date();}  
             break; 
          case '3' :
             ContrastiveDynamic.item.endTime=new Date(new Date(ContrastiveDynamic.item.startTime).setFullYear(new Date(ContrastiveDynamic.item.startTime).getFullYear()+1));
             ContrastiveDynamic.item.endTimes=new Date(new Date(ContrastiveDynamic.item.startTimes).setFullYear(new Date(ContrastiveDynamic.item.startTimes).getFullYear()+1));
            if (ContrastiveDynamic.item.endTime>new Date()){ContrastiveDynamic.item.endTime=new Date();}  
            if (ContrastiveDynamic.item.endTimes>new Date()){ContrastiveDynamic.item.endTimes=new Date();}  
           break;
        }             
      }else{
        switch (value){
          case '5' :
            ContrastiveDynamic.item.endTime=ContrastiveDynamic.item.startTimes+1;
            ContrastiveDynamic.item.endTimes=ContrastiveDynamic.item.endTime+dvalue(value,ContrastiveDynamic.item.startTime,ContrastiveDynamic.item.startTimes);
            if (ContrastiveDynamic.item.endTime>new Date().getFullYear()){ContrastiveDynamic.item.endTime=new Date().getFullYear();}  
            if (ContrastiveDynamic.item.endTimes>new Date().getFullYear()){ContrastiveDynamic.item.endTimes=new Date().getFullYear();}  
            break;
          case '4' :
            if(timeSplitRequest(ContrastiveDynamic.item.startTime).quarter===timeSplitRequest(ContrastiveDynamic.item.startTimes).quarter){
              ContrastiveDynamic.item.endTime=judgeQuerty('0102',ContrastiveDynamic.item.startTime);
              ContrastiveDynamic.item.endTimes=judgeQuerty('0102',ContrastiveDynamic.item.startTimes);
            }else{
              ContrastiveDynamic.item.endTime=judgeQuerty('0102',ContrastiveDynamic.item.startTimes);
              ContrastiveDynamic.item.endTimes=judgeQuerty('0102',ContrastiveDynamic.item.endTime);
            }
           break;
           case '3':
            ContrastiveDynamic.item.endTime=new Date(new Date(ContrastiveDynamic.item.startTimes).setMonth(new Date((ContrastiveDynamic.item.startTimes)
            .getMonth()+1)));
            ContrastiveDynamic.item.endTimes=new Date(new Date(ContrastiveDynamic.item.endTime).setMonth(new Date((ContrastiveDynamic.item.endTime)
            .getMonth()+dvalue(value,ContrastiveDynamic.item.startTime,ContrastiveDynamic.item.startTimes))));
            if (ContrastiveDynamic.item.endTime>new Date()){ContrastiveDynamic.item.endTime=new Date();}  
            if (ContrastiveDynamic.item.endTimes>new Date()){ContrastiveDynamic.item.endTimes=new Date();}  
            break;
           case '1' :
           if(dvalue(value,ContrastiveDynamic.item.startTime,ContrastiveDynamic.item.startTimes)!==0){
            ContrastiveDynamic.item.endTime=new Date(new Date(ContrastiveDynamic.item.startTimes).setDate(new Date((ContrastiveDynamic.item.startTimes)
            .getDate()+1)));
            ContrastiveDynamic.item.endTimes=new Date(new Date(ContrastiveDynamic.item.endTime).setDate(new Date((ContrastiveDynamic.item.endTime)
            .getDate()+dvalue(value,ContrastiveDynamic.item.startTime,ContrastiveDynamic.item.startTimes))));
           }else{
             ContrastiveDynamic.item.endTime=new Date(new Date(ContrastiveDynamic.item.startTimes).setDate(new Date((ContrastiveDynamic.item.startTimes)
            .getDate()+1)));
             ContrastiveDynamic.item.endTimes=ContrastiveDynamic.item.endTime;
           }
            if (ContrastiveDynamic.item.endTimes>new Date()){ContrastiveDynamic.item.endTime=new Date();}  
            if (ContrastiveDynamic.item.endTimes>new Date()){ContrastiveDynamic.item.endTimes=new Date();}  
            break;  
        } 
     }
    }
  }

  //
   /**
  * [flex 判断进入的数据是否大于当前时间]
  * @type {Boolean}
  * 判断现在是第几季度
  */
  function judgeQuerty(anaysis,param){
  // 单前时间
  var time=new Date().getFullYear();
  //传入时间
  var  year=Number(timeSplitRequest(param).timeYear);
  //当前季度
  var  quarter=Number(timeSplitRequest(param).quarter);
  //当前季度
  var querterTime=Math.ceil((new Date().getMonth()+1)/3);
    //同比,如果季度同比把 年份 加一
  if(anaysis==='0101'){
     if(year+1>time){
      return time+''+quarter;
     }else{
       if(year+1===time){
         if(quarter<=querterTime){
           return year+1+''+quarter;
         }else{
           return year+1+''+querterTime;
         }
       }else{
         return year+1+''+quarter;
       }
     }   
  }else{
    if(quarter+1<=querterTime){
      return  year+''+(quarter+1);
    }else{
      if(year===time){
        return  year+''+quarter;
      }else{
        if(quarter+1>4){
          return  year+''+4;
        }else{
          return  year+''+(quarter+1);
        }
      }
    }
  }
 }
}
     contrastiveLogicServer.$inject=['ContrastiveDynamic','$filter'];
})();